function makeArmy() {
	let shooters = []

	let i = 0
	while (i < 10) {
		// 这里每一次迭代，都创建一个变量 j，然后把 i 的值赋给 j。 j 和 shooter 函数，它们都属于同一独立的词法环境。
		let j = i
		let shooter = function () {
			// 创建一个 shooter 函数，
			console.log(j) // 应该显示其编号
		}
		shooters.push(shooter) // 将此 shooter 函数添加到数组中
		i++
	}

	return shooters
}

let army = makeArmy()

// ……所有的 shooter 显示的都是 10，而不是它们的编号 0, 1, 2, 3...
army[0]() // 0
army[1]() // 1
army[2]() // 2

// * 用 for 可以很简单解决上面迭代所带来的问题

// *************************************************************************************

// * 额外的知识:
// for 循环在每次迭代中，都会生成一个带有自己的变量 i 的新词法环境（每次循环都会创建一个新的 let i 变量来保存值）。
for (let i = 0; i < array.length; i++) {}
